/*
 * LOGIC.java
 *
 * Created on 28 de Fevereiro de 2009, 21:11
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.operacoes;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.metodos.CHAMADA_METODO;
import compilador.analisadorSintatico.metodos.VARIAVEL;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 * <LOGIC> ::= <CHAMADA_METODO> | <VARIAVEL> | '(' (<exp_REL> | <EXP_LOGIC>) ')'  | '!' <LOGIC>
 * @author Joaquim Ranyere
 */
// DEPRECIADA
public class LOGIC extends Producao{

    private Object t;
    
    /** Creates a new instance of LOGIC */
    public LOGIC() {
        
    }
    
    @Override
    public void setSimbolo() {
        NaoTerminal thisNaoTerminal = new NaoTerminal(this.getClass().getSimpleName());
    }
    
    public SimboloGramatical derivar() throws Exception {
        TokenReader tokenReader = TokenReader.getInstance();

        Token token = null;
        
        token = tokenReader.seeCurrent();
        // Analisa se !LOGIC
        //Identifica primeiro se tem o menos
        if (token.getTokenClass().equals(TokenClass.OPERADOR) && token.getAtributo().equals("!"))
        {
            ((NaoTerminal)  this.simbolo).add(new Terminal(token));
            token = tokenReader.consome();
            // Chama LOGIC novamente
            ((NaoTerminal)  this.simbolo).add(new LOGIC().derivar()); //
        }
        
        // Chamada de m�todo read e wirte
        if (token.getTokenClass().equals(TokenClass.PALAVRA_RESERVADA) && 
                (token.getAtributo().toString().equals("write") || token.getAtributo().toString().equals("read"))){
            ((NaoTerminal)  this.simbolo).add(new VARIAVEL().derivar());
        }
        
        // Chamada de M�todo e Vari�vel
        if (token.getTokenClass().equals(TokenClass.OPERADOR)){
            
            if (tokenReader.seeNext().getAtributo().equals("(")){
                ((NaoTerminal)  this.simbolo).add(new CHAMADA_METODO().derivar());
            } else
                ((NaoTerminal)  this.simbolo).add(new VARIAVEL().derivar());
            
        }
        
        
        
        // EXP_LOGIC e EXP_REL
        if (tokenReader.seeCurrent().getAtributo().equals("(")){
             token = tokenReader.consome();
             ((NaoTerminal)  this.simbolo).add(new Terminal(token));
             // E agora?
             // Fudeu a unica diferen�a s�o os operadores, e ha uma recursao antes que eles cheguem....
             // Possivel sol~��o � haver uma express�o maior que engloba as tres (arit, rel e logic)
             
        }  
  
       
        
        return ((NaoTerminal)  this.simbolo);
    }

}
